/** 
 * Speichert Daten eines Regals.
 * 
 * Datei: Regal.java 		        Autor: Simon Schindelmann 
 * Datum: 13.11.11                 	Version: 0.1
 * 
 */

package medienverwaltung;

import java.io.Serializable;
import java.util.ArrayList;

import medienverwaltung.simulation.Simulation;

public class Regal implements Serializable
{
  private static final long serialVersionUID = -4712939273993755023L;
  private Abmessung abmessungEtage;
  private int anzahlEtagen, regalId, anzahlAbschnitte;
  private String kuerzel, standortName;
  private int etagenNr = 0;
  private ArrayList<RegalEtage> regalEtage 
  	= new ArrayList<RegalEtage> ();
  private Standortverwalter sv = new Standortverwalter ();

  
  public Regal (int laenge, int hoehe, int breite, int anzahlEtagen,
      int anzahlAbschnitte, String standortName)
  {
    if (Simulation.istGenerator () == false)
    {
      Nummerngenerator n = new Nummerngenerator ();
      n.setzeZustand ();
      Simulation.setzeGenerator (true);
    }
    
    this.anzahlAbschnitte = anzahlAbschnitte;
    regalId = Nummerngenerator.generiereRegalId ();
    abmessungEtage = 
      new Abmessung (laenge * 10, (hoehe * 10) / anzahlEtagen, 
	  breite * 10);
    this.anzahlEtagen = anzahlEtagen;
    this.standortName = standortName;
    etagenErzeugen ();
  }


  /**
   * Erzeugt die Etagen.
   */
  private void etagenErzeugen ()
  {
    for (int i = 0; i < anzahlEtagen; i++)
    {
      etagenNr = etagenNr + 1;
      RegalEtage re = new RegalEtage (anzahlAbschnitte, abmessungEtage,
          etagenNr);
      regalEtage.add (re);
    }
  }

  
  /**
   * Hier wird das Kuerzel gesetzt. 
   * @param k Kuerzel des Regals.
   */
  public void setzeKuerzel (String k)
  {
    kuerzel = k;
    sv.zustandSpeichern ();
  }

  
  /**
   * Hier werden die Abmessungen (Laenge, Breite, Hoehe) des Regals 
   * gesetzt.
   * @return Abmessungen des Regals.
   */
  public Abmessung gibAbmessungEtage ()
  {
    return abmessungEtage;
  }

  
  /**
   * Gibt die Anzahl der Etagen des Regals zurueck.
   * @return Anzahl der Etagen.
   */
  public int gibAnzahlEtagen ()
  {
    return anzahlEtagen;
  }


  /**
   * Gibt den Kuerzel des Regals zurueck.
   * @return Kuerzel des Regals.
   */
  public String gibKuerzel ()
  {
    return kuerzel;
  }


  /**
   * Gibt die ID des Regals zurueck.
   * @return ID des Regals.
   */
  public int gibRegalId ()
  {
    return regalId;
  }


  /**
   * Gibt die Liste mit den Regaletagen zurueck.
   * @return ArrayListe mit den Regaletagen.
   */
  public ArrayList<RegalEtage> gibRegalEtage ()
  {
    return regalEtage;
  }
  
  
  /**
   * Gibt die Breite des Regals zurueck.
   * @return Breite des Regals.
   */
  public int gibBreite ()
  {
    return abmessungEtage.gibBreite ();
  }
  
 
  /**
   * Gibt die Laenge des Regals zurueck.
   * @return Laenge des Regals.
   */
  public int gibLaenge ()
  {
    return abmessungEtage.gibLaenge ();
  }
  
  
  /**
   * Gibt die Etagen Hoehe des Regals zurueck.
   * @return Hoehe der Etage.
   */
  public int gibEtagenHoehe ()
  {
    return abmessungEtage.gibHoehe ();
  }
  
  
  /**
   * Hier wird die Hoehe der Etagen im Regal gesetzt.
   * @param hoehe Hoehe die die Etagen haben sollen.
   */
  public void setzeEtagenHoehe (int hoehe)
  {
    abmessungEtage.setzeHoehe (hoehe);
    sv.zustandSpeichern ();
  }
  
  
  /**
   * Hier wird die Laenge des Regals gesetzt.
   * @param laenge Lange des Regals.
   */
  public void setzeLaenge (int laenge)
  {
    abmessungEtage.setzeLaenge (laenge * 10);
    sv.zustandSpeichern ();
  }
  
  
  /**
   * Hier wird die Breite des Regals gesetzt.
   * @param breite Breite des Regals.
   */
  public void setzeBreite (int breite)
  {
    abmessungEtage.setzeBreite (breite * 10);
    sv.zustandSpeichern ();
  }
  
  
  /**
   * Gibt die Anzahl der Abschnitte zurueck.
   * @return Anzahl der Abschnitte.
   */
  public int gibAbschnitte ()
  {
    return anzahlAbschnitte;
  }
  
  
  /**
   * Setzt die Regal ID
   * @param id ID des Regals.
   */
  public void setzeId (int id)
  {
    regalId = id;
    sv.zustandSpeichern ();
  }
  
  
  /**
   * Gibt den Standortnamen zurueck.
   * @return Name des Standorts.
   */
  public String gibstandortName ()
  {
    return standortName;
  }


  /**
   * Gibt die Regaletage mit der entsprechenden Nummer zurueck.
   * 
   * @param etagenNr Nummer der Regaletage.
   * @return gibt die Regaletage mit der entsprechneden Nummer zureuck
   * falls die Nummer nicht existiert wird null zurueck gegeben.
   */
  public RegalEtage gibRegaletage (int etagenNr)
  {
    RegalEtage re;
    for (int i = 0; i < regalEtage.size (); i++)
    {
      re = regalEtage.get (i);
      if (etagenNr == re.gibEtagenNr ())
      {
        return re;
      }
    }
    return null;
  }
  
  
  /**
   * Gibt die Informationen ueber das Regal zurueck.
   * @return String mit den Informationen ueber das Regal.
   */
  public String regalInfo()
  {
    String info;
    info = "" + regalId + "\n" + anzahlEtagen + "\n" + anzahlAbschnitte 
    	+ "\n" + kuerzel + "\n" + abmessungEtage.gibBreite () + " " 
    	+ abmessungEtage.gibLaenge () + " " + abmessungEtage
    	.gibHoehe () * anzahlEtagen;
    return info;
    	
  }
}
